#include "ArchFrases.h"
#include <iostream>

ArchFrases::ArchFrases() :_arch(), _cabecera(256)
{
}

ArchFrases::~ArchFrases() {
	cerrar();
}

void ArchFrases::abrir(std::string nombre){
	this->_arch.abrirArch(this->_cabecera, nombre);
}

void ArchFrases::crear(std::string nombre){
	this->_arch.crearArch(this->_cabecera, nombre);
}


int ArchFrases::guardarFrase(const BloqueFrase &bf, int pos){
	if (pos == -1){
		pos = this->_cabecera.getPosBloqueLibre();

		// Si no hay ningun bloque libre y se debe insertar el bloque al final
		if (pos == -1){
			// Entonces SI hay que aumentar la cantidad de bloques del archivo
			this->_cabecera.setCantBloques( this->_cabecera.getCantBloques()+1 );
		}

	} else {
		// No se permite guardar donde esta la cabecera
		++pos;
		if (pos < 1 || pos >= this->_cabecera.getCantBloques()){
			throw std::runtime_error("Se trata de guardar un bloque fuera del rango permitido");
		}
	}

	int posGuardado = this->_arch.guardar(const_cast<BloqueFrase&>(bf), pos);

	// Para mantener siempre la cabecera actualizada
	this->_arch.guardar(this->_cabecera, 0);

	return posGuardado;
}

void ArchFrases::leerFrase(BloqueFrase &bf, int pos){
	// No se puede permitir leer la cabecera
	++pos;
	if (pos <1 || pos >= this->_cabecera.getCantBloques()){
		throw std::runtime_error("La posicion de lectura esta fuera del rango permitido");
	}

	this->_arch.leer(bf, pos);
}

bool ArchFrases::is_open() const{
	return this->_arch.is_open();
}

void ArchFrases::cerrar(){
	if (!this->_arch.is_open()) return;

	this->_arch.guardar(this->_cabecera, 0);
	this->_arch.cerrar();
}

unsigned int ArchFrases::getCantBloques() const{
	return this->_cabecera.getCantBloques();
}


void ArchFrases::borrarFrase(int pos){
	// No se permite borrar la cabecera
	++pos;
	if (pos <1 || pos >= this->_cabecera.getCantBloques()){
		throw std::runtime_error("La posicion de borrado esta fuera del rango del archivo");
	}

	bool exito = this->_arch.borrarBloque(pos);
	if (exito){
		this->_cabecera.liberarBloque(pos);
	}
}



